package log

import (
	"context"
	"github.com/cloudwego/hertz/pkg/common/hlog"
	_ "github.com/cloudwego/hertz/pkg/common/hlog"
	"github.com/sirupsen/logrus"
	"wails-hertz/server/configuration/sw"
	istring "wails-hertz/server/kits/strings"
)

// LogrusAdapter 适配 logrus.Logger 到 hlog.FullLogger 接口
type LogrusAdapter struct {
	*logrus.Logger // 嵌入原生 Logrus 实例，复用已有方法
}

func (l *LogrusAdapter) SetLevel(level hlog.Level) {
	// 映射 hlog 级别到 logrus 级别
	switch level {
	case hlog.LevelTrace:
		l.Logger.SetLevel(logrus.TraceLevel)
	case hlog.LevelDebug:
		l.Logger.SetLevel(logrus.DebugLevel)
	case hlog.LevelInfo:
		l.Logger.SetLevel(logrus.InfoLevel)
	case hlog.LevelNotice:
		l.Logger.SetLevel(logrus.InfoLevel) // hlog.Notice 映射为 logrus.Info
	case hlog.LevelWarn:
		l.Logger.SetLevel(logrus.WarnLevel)
	case hlog.LevelError:
		l.Logger.SetLevel(logrus.ErrorLevel)
	case hlog.LevelFatal:
		l.Logger.SetLevel(logrus.FatalLevel)
	default:
		l.Logger.SetLevel(logrus.InfoLevel) // 默认级别
	}
}

// 补充 hlog.FullLogger 要求的 Notice 方法（对应 "notice" 级别日志）
// 可映射为 Logrus 的 Info 级别（或根据需求调整）
func (l *LogrusAdapter) Notice(v ...interface{}) {
	l.Info(v...)
}

// 补充 Noticef 方法
func (l *LogrusAdapter) Noticef(format string, v ...interface{}) {
	l.Infof(format, v...)
}

// CtxNoticef 带上下文的 Noticef 日志（适配 hlog.FullLogger）
// 映射为 Logrus 的 Infof 级别，可从上下文提取额外信息（如 tid）
func (l *LogrusAdapter) CtxNoticef(ctx context.Context, format string, v ...interface{}) {
	// 可选：从上下文提取信息（例如从 Hertz 请求上下文获取 tid）
	// 示例：若上下文包含 tid，可添加到日志字段
	tid := sw.Tid(ctx)
	if istring.IsNotEmpty(tid) {
		l.WithField("tid", tid).Infof(format, v...)
		return
	}
	l.Infof(format, v...)
}

// 补充 CtxTracef 方法（带上下文的 Trace 级别日志）
// 可映射为 Logrus 的 Trace 级别
func (l *LogrusAdapter) CtxTracef(ctx context.Context, format string, v ...interface{}) {
	tid := sw.Tid(ctx)
	if istring.IsNotEmpty(tid) {
		l.WithField("tid", tid).Tracef(format, v...)
		return
	}
	l.Tracef(format, v...)
}

// 其他可能缺失的方法（根据编译错误补充）
// 例如：CtxDebugf、CtxInfof 等，直接复用 Logrus 的对应方法并传入上下文
func (l *LogrusAdapter) CtxDebugf(ctx context.Context, format string, v ...interface{}) {
	tid := sw.Tid(ctx)
	if istring.IsNotEmpty(tid) {
		l.WithField("tid", tid).Debugf(format, v...)
		return
	}
	l.Debugf(format, v...)
}

func (l *LogrusAdapter) CtxInfof(ctx context.Context, format string, v ...interface{}) {
	tid := sw.Tid(ctx)
	if istring.IsNotEmpty(tid) {
		l.WithField("tid", tid).Infof(format, v...)
		return
	}
	l.Infof(format, v...)
}

func (l *LogrusAdapter) CtxWarnf(ctx context.Context, format string, v ...interface{}) {
	tid := sw.Tid(ctx)
	if istring.IsNotEmpty(tid) {
		l.WithField("tid", tid).Warnf(format, v...)
		return
	}
	l.Warnf(format, v...)
}

func (l *LogrusAdapter) CtxErrorf(ctx context.Context, format string, v ...interface{}) {
	tid := sw.Tid(ctx)
	if istring.IsNotEmpty(tid) {
		l.WithField("tid", tid).Errorf(format, v...)
		return
	}
	l.Errorf(format, v...)
}

func (l *LogrusAdapter) CtxFatalf(ctx context.Context, format string, v ...interface{}) {
	tid := sw.Tid(ctx)
	if istring.IsNotEmpty(tid) {
		l.WithField("tid", tid).Fatalf(format, v...)
		return
	}
	l.Fatalf(format, v...)
}
